package com.snda.sc.config;

import java.io.File;
import java.util.Set;

/**
 * 实现此接口表示可进行配置。
 * 
 * @author <a href="mailto:seenoevil.cn@gmail.com">李曦</a><br/>
 *         Created at: 2012-10-3 上午9:57:51
 */
public interface Configurable {

	/**
	 * 配置文件的类型。{@link ConfigRegistry}会根据类型到相应的目录下加载配置文件，类型：<br>
	 * <ul>
	 * <li>全局类型：配置文件在$TOMCAT_HOME/webapps/conf目录下</li>
	 * <li>应用类型：配置文件在$AppRoot/WEB-INF/conf目录下
	 * <li>
	 * </ul>
	 * 
	 * @author <a href="mailto:seenoevil.cn@gmail.com">李曦</a><br/>
	 *         Created at: 2012-10-3 上午10:00:52
	 */
	enum Scope {
		/** 全局类型 */
		GLOBAL,
		/** 应用类型 */
		APP;
	}

	/**
	 * 解析配置文件
	 * 
	 * @param confFile
	 *            配置文件
	 * @throws Exception
	 */
	void configure(File confFile) throws Exception;

	/**
	 * 需要读取的配置文件名。根据不同的{@link Scope}，会在不同的目录下根据文件名加载配置文件。
	 * 
	 * @return
	 */
	Set<String> getConfigFileNames();

	/**
	 * 是否需要监听配置文件的变化。如果需要监听，则在配置文件发生变化时会再次调用{@link #configure(File)}
	 * 方法。否则就不会关注配置文件的修改。
	 * 
	 * @return
	 */
	boolean watchModify();

	/**
	 * 指定文件类型。
	 * 
	 * @return
	 */
	Scope getScope();
}
